import threading
import pikepdf
from typing import Optional
import os
import logging

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler("pdf_crack.log", encoding='utf-8'),
        logging.StreamHandler()
    ]
)
logger = logging.getLogger(__name__)
# 处理单个PDF文件
def pdf_crack(input_file: str, output_file: Optional[str] = None) -> str:
    """移除PDF文件的编辑限制
    Args:
        input_file: 输入PDF文件路径
        output_file: 输出PDF文件路径，如果为None则在原文件名基础上添加"(已破解)"后缀
    Returns:
        输出文件的路径

    Raises:
        FileNotFoundError: 当输入文件不存在时
        pikepdf._qpdf.PdfError: 当PDF文件有打开密码或其他PDF处理错误时
        PermissionError: 当没有权限写入输出文件时
    """
    # 检查输入文件是否存在
    if not os.path.exists(input_file):
        raise FileNotFoundError(f"输入文件不存在: {input_file}")

    # 如果未指定输出文件，则生成默认输出文件名
    if output_file is None:
        base_name, ext = os.path.splitext(input_file)
        output_file = f"{base_name}(已破解){ext}"

    try:
        # 使用pikepdf打开并保存PDF文件，这将移除编辑限制
        with pikepdf.open(input_file) as pdf:
            pdf.save(output_file)
            logger.info(f"PDF限制已成功移除！输出文件: {output_file}")
            return output_file
    except pikepdf._qpdf.PdfError as e:
        # 处理PDF相关错误，如打开密码等
        if "need password" in str(e).lower():
            raise pikepdf._qpdf.PdfError("PDF文件受打开密码保护，此工具无法破解打开密码")
        else:
            raise

# 判断文件夹是否存在,如果不存在则创建
def check_folder(folder_path: str) -> bool:
    """检查文件夹是否存在
    Args:
        folder_path: 文件夹路径
    Returns:
        bool: 如果文件夹存在则返回True，否则返回False
    """
    if os.path.exists(folder_path):
        return True
    else:
        try:
            os.makedirs(folder_path)
            logger.info(f"文件夹不存在，已创建: {folder_path}")
            return True
        except OSError as e:
            logger.error(f"创建文件夹失败: {folder_path}，错误信息: {str(e)}")
            return False
